﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionContrato;
using ClickLand.CorporacionPlaza.Presentacion.Controladores;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Utilidades;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionContrato
{
    /// <summary> Clase que hace de presentador para la vista que administra los contratos </summary>
    public class PresentadorAdministrarContrato:PresentadorBase
    {
        #region Atributos

        private readonly IAdministrarContrato _vista;
        private readonly ControladorAdministracionContrato _controlador;
        private readonly ControladorAdministracionEstablecimiento _controladorEstablecimiento;
        private readonly ControladorAdministracionCliente _controladorCliente;

        #endregion

        #region Constructor

        /// <summary> Constructor de la clase </summary>
        /// <param name="vista">Parametros de la vista</param>
        public PresentadorAdministrarContrato(IAdministrarContrato vista)
        {
            _vista = vista;
            _controlador = new ControladorAdministracionContrato();
            _controladorEstablecimiento = new ControladorAdministracionEstablecimiento();
            _controladorCliente = new ControladorAdministracionCliente();
        }

        #endregion

        #region Metodos
        
        /// <summary> Metodo que realiza las operaciones para realizar la carga de la pagina </summary>
        public void CargarPagina()
        {

            CargarListaConValor(_vista.TipoEstablecimientoBusqueda, "tipoEstablecimiento", true);
            CargarListaSinValor(_vista.TipoDocumento, "letraRifNatural", true);
            CargarListaSinValor(_vista.TipoFirma, "tipoFirmas", true);
        }


        /// <summary> Metodo que realiza la busqueda de contratos </summary>
        public void BuscarContrato()
        {
            ContratoDto contrato = new ContratoDto();
            contrato.Estado = (int)Estados.Nuevo;
            if(Convert.ToInt32(_vista.TipoEstablecimientoBusqueda.SelectedValue) != -1)
            {
                EstablecimientoDto establecimiento = new EstablecimientoDto();
                establecimiento.Id = Convert.ToInt64(_vista.TipoEstablecimientoBusqueda.SelectedValue);
                contrato.Establecimiento = establecimiento;
            }
            contrato.NombreComercial = _vista.NombreComercialBusqueda;
            if (!string.IsNullOrEmpty(_vista.NombreClienteBusqueda))
            {
                contrato.Cliente = new ClienteDto();
                contrato.Cliente.Nombre = _vista.NombreClienteBusqueda;
            }
            _vista.ListaContratos = _controlador.BuscarContrato(contrato);

        }


        /// <summary> Metodo que realiza la operacion para imprimir los reportes </summary>
        public void ImprimirReporte()
        {
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document,
                                  new FileStream(ConfigurationManager.AppSettings["RutaDescarga"] +
                                      "ReporteConsultaContrato.pdf", FileMode.Create));
            PdfPTable tabla;
            PdfPCell celdaTitulo;
            string[] titulosCeldas;
            Paragraph ptitulo;
            Chunk titulo;

            try
            {
                document.SetMargins(36, 36, 36, 100);
                document.Open();


                #region Cuerpo del Reporte


                #region Tabla Historico Planes


                #region Titulo de Tabla
                titulo = new Chunk("Contratos \n\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
                ptitulo = new Paragraph();
                ptitulo.Alignment = Element.ALIGN_CENTER;
                ptitulo.Add(titulo);
                document.Add(ptitulo);
                #endregion

                var lista = _vista.ListaContratos;
                if (lista.Count > 0)
                {
                    #region Encabezado de la tabla
                    tabla = new PdfPTable(6);
                    tabla.WidthPercentage = 100;
                    tabla.HorizontalAlignment = Element.ALIGN_LEFT;
                    titulosCeldas = _vista.TituloReporte.Split(';');


                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[0], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;

                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[1], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[2], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[3], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[4], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[5], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    #endregion

                    #region Cuerpo de la Tabla


                    foreach (var contrato in lista)
                    {
                        BaseColor color = ((contrato.Estado == 0) || (contrato.FechaFin < DateTime.Now)) ? BaseColor.RED : BaseColor.WHITE;
                        PdfPCell celdaContenido = new PdfPCell(new Phrase(contrato.Establecimiento.Numero, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato.Establecimiento.Tipo.Descripcion, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato.NombreComercial, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato.Cliente.Nombre, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato.FechaInicio.GetValueOrDefault().ToString("dd/MM/yyyy"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato.FechaFin.ToString("dd/MM/yyyy"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);
                    }

                    document.Add(tabla);

                    #endregion
                }
                else
                {

                    Paragraph parrafo = new Paragraph(new Chunk("No Existe Contratos \n\n",
                                                                FontFactory.GetFont("Verdana", 10, Font.BOLD)));
                    parrafo.Alignment = Element.ALIGN_CENTER;
                    document.Add(parrafo);
                }


                #endregion


                #endregion

                document.Close();
            }
            catch (Exception e)
            {
                if (document.IsOpen())
                    document.Close();
            }
        }


        /// <summary> Metodo que muestra el detalle de un contrato </summary>
        /// <param name="idContrato"></param>
        public void MostrarDetalle(long idContrato)
        {
            var lista = _vista.ListaContratos;
            _vista.Contrato = (from objeto in lista
                               where objeto.Id == idContrato
                               select objeto).First();
            ContratoDto contrato = _vista.Contrato;
            _vista.NombreClienteDetalle = contrato.Cliente.Nombre;
            _vista.EstablecimientoDetalle = contrato.Establecimiento.Numero;
            _vista.TipoFirmaDetalle = contrato.TipoFirma;
            _vista.PorcentajeDetalle = contrato.PorcentajeVenta.ToString("N") + "%";
            _vista.NombreComercialDetalle = contrato.NombreComercial;
            _vista.NombreFirmanteDetalle = contrato.NombreFirmante;

            _vista.HayOtroFirmantes = contrato.TipoFirma.Equals("Conjunta");
            if (contrato.TipoFirma.Equals("Conjunta"))
            {
                _vista.NombreFirmante2Detalle = contrato.NombreFirmante2;
                _vista.NombreFirmante3Detalle = contrato.NombreFirmante3;
            }

            _vista.FechaInicioDetalle = contrato.FechaInicio.GetValueOrDefault().ToString("dd/MM/yyyy");
            _vista.FechaFinDetalle = contrato.FechaFin.ToString("dd/MM/yyyy");
            _vista.ListaCanonDetalle = contrato.Pension.ContratoPensiones;
            _vista.TipoIncrementoDetalle = contrato.Pension.Tipo.Equals("0") ? "Simple" : "Compuesto";
            _vista.FiadorDetalle = contrato.Fiadores;
            _vista.PolizaDetalle = contrato.Polizas;
            _vista.MontoGarantiaDetalle = contrato.MontoGarantia.ToString("N") + " BsF.";
        }

        
        /// <summary> Metodo que realiza la operaciones para agregar los datos de un fiador </summary>
        public void AgregarFiador()
        {
            var contrato = _vista.Contrato;
            if (_vista.GarantiaFiador)
            {
                List<FiadorDto> lista = contrato.Fiadores.ToList();

                var fiador = new FiadorDto();
                fiador.Nombre = _vista.NombreFiador;
                fiador.Correo = _vista.CorreoFiador;
                fiador.Telefono = _vista.NumeroTelefonoFiador;
                fiador.Cedula = _vista.CedulaFiador;
                fiador.Estado = (int)Estados.Activo;
                lista.Add(fiador);

                contrato.Fiadores = lista.ToArray();
                _vista.FiadorDetalle = contrato.Fiadores;
            }
            else
            {
                contrato.MontoGarantia = Convert.ToDouble(_vista.MontoGaranta);
                _vista.MontoGarantiaDetalle = contrato.MontoGarantia.ToString("N");
            }
            _vista.Contrato = contrato;

        }


        /// <summary> Metodo que realiza la operaciones para agregar los datos de un fiador </summary>
        /// <param name="idFiador"> </param>
        public void ModificarFiador(long idFiador)
        {
            var lista = _vista.Contrato.Fiadores.ToList();
            var fiador = (from objeto in lista
                          where objeto.Id == idFiador
                          select objeto).First();
            lista.Remove(fiador);
            fiador.Nombre = _vista.NombreFiador;
            fiador.Correo = _vista.CorreoFiador;
            fiador.Telefono = _vista.NumeroTelefonoFiador;
            fiador.Cedula = _vista.CedulaFiador;
            fiador.Estado = (int)Estados.Activo;
            lista.Add(fiador);

            _vista.Contrato.Fiadores = lista.ToArray();
            _vista.FiadorDetalle = _vista.Contrato.Fiadores;
        }


        /// <summary> Metodo que carga los datos del fiador </summary>
        /// <param name="id">identificador del fiador</param>
        public void CargarDatosFiador(long id)
        {
            var lista = _vista.Contrato.Fiadores.ToList();
            var fiador = (from objeto in lista
                                   where objeto.Id == id
                                   select objeto).First();
            _vista.NombreFiador = fiador.Nombre;
            _vista.CorreoFiador = fiador.Correo;
            _vista.NumeroTelefonoFiador = fiador.Telefono;
            _vista.CedulaFiador = fiador.Cedula;

            _vista.MontoGaranta = _vista.Contrato.MontoGarantia.ToString("N");
        }


        /// <summary> Metodo que realiza las operaciones para agregar los datos de una poliza </summary>
        public void AgregarPoliza()
        {
            var contrato = _vista.Contrato;
            List<PolizaDto> lista = contrato.Polizas.ToList();
            var poliza = new PolizaDto();
            poliza.Aseguradora = _vista.EmpresaAsegurador;
            poliza.Beneficiario = _vista.NombreBeneficiarioPoliza;
            poliza.FechaEmision = _vista.FechaEmisionPoliza;
            poliza.FechaFin = _vista.FechaVencimientoPoliza;
            poliza.Monto = Convert.ToSingle(_vista.MontoPoliza);
            poliza.Estado = (int)Estados.Activo;
            lista.Add(poliza);

            contrato.Polizas = lista.ToArray();
            _vista.PolizaDetalle = contrato.Polizas;
        }


        /// <summary> Metodo que realiza las operaciones para modificar los datos de una poliza </summary>
        /// <param name="idPoliza">Identificador de la poliza</param>
        public void ModificarPoliza(int idPoliza)
        {
            var lista = _vista.Contrato.Polizas.ToList();
            var poliza = (from objeto in lista
                          where objeto.Id == idPoliza
                          select objeto).First();
            lista.Remove(poliza);
            poliza.Aseguradora = _vista.EmpresaAsegurador;
            poliza.Beneficiario = _vista.NombreBeneficiarioPoliza;
            poliza.FechaEmision = _vista.FechaEmisionPoliza;
            poliza.FechaFin = _vista.FechaVencimientoPoliza;
            poliza.Monto = Convert.ToSingle(_vista.MontoPoliza);
            poliza.Estado = (int)Estados.Activo;
            lista.Add(poliza);

            _vista.Contrato.Polizas = lista.ToArray();
            _vista.PolizaDetalle = _vista.Contrato.Polizas;
        }


        /// <summary> Metodo que carga los datos de la poliza en la ventana </summary>
        /// <param name="idPoliza"></param>
        public void CargarDatosPoliza(int idPoliza)
        {
            var lista = _vista.Contrato.Polizas.ToList();
            var poliza = (from objeto in lista
                          where objeto.Id == idPoliza
                          select objeto).First();
            lista.Remove(poliza);
            _vista.EmpresaAsegurador = poliza.Aseguradora;
            _vista.NombreBeneficiarioPoliza = poliza.Beneficiario;
            _vista.FechaEmisionPoliza = poliza.FechaEmision;
            _vista.FechaVencimientoPoliza = poliza.FechaFin;
            _vista.MontoPoliza = poliza.Monto.ToString("N");
            lista.Add(poliza);
        }


        /// <summary> Metodo que carga los datos prinicipales del contrato </summary>
        public void CargarDatosPrincipales()
        {
            var contrato = _vista.Contrato;
            _vista.FechaInicioContrato = contrato.FechaInicio.GetValueOrDefault();
            _vista.FechaFinContrato = contrato.FechaFin;
            _vista.PorcentajeVenta = contrato.PorcentajeVenta.ToString("N");
            _vista.TipoFirma.SelectedIndex = _vista.TipoFirma.Items.IndexOf(_vista.TipoFirma.Items.FindByText(contrato.TipoFirma));
            _vista.NombreFirmante = contrato.NombreFirmante;
            _vista.NombreComercial = contrato.NombreComercial;
            if (contrato.TipoFirma.Equals("Conjunta"))
            {
                _vista.NombreFirmante2 = contrato.NombreFirmante2;
                _vista.NombreFirmante3 = contrato.NombreFirmante3;
            }
        }


        /// <summary> Metodo que actualiza los datos principales </summary>
        public void ModificarDatosPrincipales()
        {
            var contrato = _vista.Contrato;
            contrato.FechaInicio = _vista.FechaInicioContrato;
            contrato.FechaFin = _vista.FechaFinContrato;
            contrato.PorcentajeVenta = Convert.ToSingle(_vista.PorcentajeVenta);
            contrato.TipoFirma = _vista.TipoFirma.SelectedItem.Text;
            contrato.NombreFirmante = _vista.NombreFirmante;
            contrato.NombreComercial = _vista.NombreComercial;
            if (contrato.TipoFirma.Equals("Conjunta"))
            {
                contrato.NombreFirmante2 = _vista.NombreFirmante2;
                contrato.NombreFirmante3 = _vista.NombreFirmante3;
            }

            _vista.Contrato = contrato;
            MostrarDetalle(_vista.Contrato.Id);
        }


        /// <summary> Metodo que muestra la lista de recaudos del contrato </summary>
        /// <param name="id">identificador del registro</param>
        public void MostrarRecaudos(int id)
        {

            ContratoDto contrato = _vista.Contrato;
            _vista.ListaRecaudos = contrato.Recaudos;

        }

        #endregion

        /// <summary> Metodo que modifica los datos de un contrato </summary>
        /// <returns></returns>
        public bool ModificarContrato()
        {
            _vista.Contrato.Garantia = new GarantiaDto { Id = 1 };
            _vista.Contrato.Estado =
                (int) (_vista.Contrato.FechaFin > DateTime.Now.AddDays(1) ? Estados.Activo : Estados.Inactivo);
            return _controlador.AgregarContrato(_vista.Contrato);
        }


        /// <summary> Metodo que realiza la eliminacion de un contrato </summary>
        /// <returns></returns>
        public bool EliminarContrato()
        {
            _vista.Contrato.Garantia = new GarantiaDto { Id = 1 };
            _vista.Contrato.Estado = 0;
            foreach (var fiador in _vista.Contrato.Fiadores)
                fiador.Estado = 0;
            foreach (var poliza in _vista.Contrato.Polizas)
                poliza.Estado = 0;
            return _controlador.AgregarContrato(_vista.Contrato);
        }
    }
}
